#include"blockqueue.h"
// 生产者线程函数
void producer(BlockQueue& queue, int id, int produce_count) {
    for (int i = 0; i < produce_count; ++i) {
        int item = rand() % 100;               // 生成随机数据
        queue.enqueue(item);                   // 放入队列
        std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟生产延迟
    }
}
// 消费者线程函数
void consumer(BlockQueue& queue, int id, int consume_count) {
    for (int i = 0; i < consume_count; ++i) {
        queue.dequeue();                       // 从队列中取数据
        std::this_thread::sleep_for(std::chrono::milliseconds(150)); // 模拟消费延迟
    }
}
int main() {
    size_t queue_size = 5;                     // 队列最大容量
    int producer_count = 2;                    // 生产者线程数量
    int consumer_count = 2;                    // 消费者线程数量
    int produce_count = 10;                    // 每个生产者生产的数量
    int consume_count = 10;                    // 每个消费者消费的数量
    BlockQueue queue(queue_size);
    // 创建生产者线程
    std::vector<std::thread> producers;
    for (int i = 0; i < producer_count; ++i) {
        producers.emplace_back(producer, std::ref(queue), i + 1, produce_count);
    }
    // 创建消费者线程
    std::vector<std::thread> consumers;
    for (int i = 0; i < consumer_count; ++i) {
        consumers.emplace_back(consumer, std::ref(queue), i + 1, consume_count);
    }
    // 等待所有线程完成
    for (auto& t : producers) {
        t.join();
    }
    for (auto& t : consumers) {
        t.join();
    }
    std::cout << "生产者与消费者模型运行完成！" << std::endl;
    return 0;
}
